#include "gtkheaderbarprivate.h"
+#include "gtkactionable.h"
#include "gtkbox.h"
#include "gtkbutton.h"
#include "gtkbuildable.h"
g_object_set (image, "use-fallback", TRUE, NULL);
gtk_container_add (GTK_CONTAINER (button), image);
gtk_widget_set_can_focus (button, FALSE);
- g_signal_connect_swapped (button, "clicked",
- G_CALLBACK (gtk_window_minimize), window);
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (button),
+ "window.minimize");
accessible = gtk_widget_get_accessible (button);
if (GTK_IS_ACCESSIBLE (accessible))
g_object_set (image, "use-fallback", TRUE, NULL);
gtk_container_add (GTK_CONTAINER (button), image);
gtk_widget_set_can_focus (button, FALSE);
- g_signal_connect_swapped (button, "clicked",
- G_CALLBACK (_gtk_window_toggle_maximized), window);
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (button),
+ "window.toggle-maximized");
accessible = gtk_widget_get_accessible (button);
if (GTK_IS_ACCESSIBLE (accessible))
g_object_set (image, "use-fallback", TRUE, NULL);
gtk_container_add (GTK_CONTAINER (button), image);
gtk_widget_set_can_focus (button, FALSE);
- g_signal_connect_swapped (button, "clicked",
- G_CALLBACK (gtk_window_close), window);
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (button),
+ "window.close");
accessible = gtk_widget_get_accessible (button);
if (GTK_IS_ACCESSIBLE (accessible))
#include "gtkwindowprivate.h"
#include "gtkaccelgroupprivate.h"
+#include "gtkactionable.h"
#include "gtkapplicationprivate.h"
#include "gtkbox.h"
#include "gtkbuildable.h"
const gchar *name);
static void gtk_window_realize_icon (GtkWindow *window);
static void gtk_window_unrealize_icon (GtkWindow *window);
-static void update_window_buttons (GtkWindow *window);
+static void update_window_actions (GtkWindow *window);
static void get_shadow_width (GtkWindow *window,
GtkBorder *shadow_width);
static void gtk_window_activate_default_activate (GtkWidget *widget,
const char *action_name,
GVariant *parameter);
+static void gtk_window_activate_minimize (GtkWidget *widget,
+ const char *action_name,
+ GVariant *parameter);
+static void gtk_window_activate_toggle_maximized (GtkWidget *widget,
+ const char *name,
+ GVariant *parameter);
+static void gtk_window_activate_close (GtkWidget *widget,
+ const char *action_name,
+ GVariant *parameter);
static void gtk_window_do_popup (GtkWindow *window,
GdkEvent *event);
gtk_widget_class_install_action (widget_class, "default.activate", NULL,
gtk_window_activate_default_activate);
+ /**
+ * GtkWindow|window.minimize:
+ *
+ * Close the window.
+ */
+ gtk_widget_class_install_action (widget_class, "window.minimize", NULL,
+ gtk_window_activate_minimize);
+
+ /**
+ * GtkWindow|window.toggle-maximized:
+ *
+ * Maximize or restore the window.
+ */
+ gtk_widget_class_install_action (widget_class, "window.toggle-maximized", NULL,
+ gtk_window_activate_toggle_maximized);
+
+ /**
+ * GtkWindow|window.close:
+ *
+ * Close the window.
+ */
+ gtk_widget_class_install_action (widget_class, "window.close", NULL,
+ gtk_window_activate_close);
+
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_space, 0,
"activate-focus", NULL);
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Space, 0,
gtk_window_real_activate_default (GTK_WINDOW (widget));
}
+static void
+gtk_window_activate_minimize (GtkWidget *widget,
+ const char *name,
+ GVariant *parameter)
+{
+ gtk_window_minimize (GTK_WINDOW (widget));
+}
+
+static void
+gtk_window_activate_toggle_maximized (GtkWidget *widget,
+ const char *name,
+ GVariant *parameter)
+{
+ _gtk_window_toggle_maximized (GTK_WINDOW (widget));
+}
+
+static void
+gtk_window_activate_close (GtkWidget *widget,
+ const char *name,
+ GVariant *parameter)
+{
+ gtk_window_close (GTK_WINDOW (widget));
+}
+
static gboolean
gtk_window_accept_rootwindow_drop (GtkDropTargetAsync *self,
GdkDrop *drop,
gtk_grab_remove (widget);
}
- update_window_buttons (window);
+ update_window_actions (window);
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_MODAL]);
}
}
}
- update_window_buttons (window);
+ update_window_actions (window);
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_TRANSIENT_FOR]);
}
if (priv->surface)
gdk_toplevel_set_decorated (GDK_TOPLEVEL (priv->surface), priv->decorated && !priv->client_decorated);
- update_window_buttons (window);
+ update_window_actions (window);
gtk_widget_queue_resize (GTK_WIDGET (window));
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_DECORATED]);
if (priv->surface)
gdk_toplevel_set_deletable (GDK_TOPLEVEL (priv->surface), priv->deletable);
- update_window_buttons (window);
+ update_window_actions (window);
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_DELETABLE]);
}
}
static void
-update_window_buttons (GtkWindow *window)
+update_window_actions (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+ gboolean is_sovereign_window = !priv->modal && !priv->transient_parent;
+
+ gtk_widget_action_set_enabled (GTK_WIDGET (window), "window.minimize",
+ is_sovereign_window);
+ gtk_widget_action_set_enabled (GTK_WIDGET (window), "window.toggle-maximized",
+ priv->resizable && is_sovereign_window);
+ gtk_widget_action_set_enabled (GTK_WIDGET (window), "window.close",
+ priv->deletable);
if (!update_csd_visibility (window))
return;
priv->title_box = priv->titlebar;
}
- update_window_buttons (window);
+ update_window_actions (window);
}
static void
GDK_SURFACE_STATE_TOP_TILED |
GDK_SURFACE_STATE_RIGHT_TILED |
GDK_SURFACE_STATE_BOTTOM_TILED |
- GDK_SURFACE_STATE_LEFT_TILED))
+ GDK_SURFACE_STATE_LEFT_TILED |
+ GDK_SURFACE_STATE_MINIMIZED))
{
update_window_style_classes (window);
- update_window_buttons (window);
+ update_window_actions (window);
gtk_widget_queue_resize (widget);
}
}
{
priv->resizable = resizable;
- update_window_buttons (window);
+ update_window_actions (window);
gtk_widget_queue_resize (GTK_WIDGET (window));